\subsubsection{Base64}
\myindex{Base64}

Кодировка base64 очень популярна в тех случаях, когда нужно передать двоичные данные как текстовую строку.

По сути, этот алгоритм кодирует 3 двоичных байта в 4 печатаемых символа:
все 26 букв латинского алфавита (в обоих регистрах), цифры, знак плюса (\q{+}) и слэша (\q{/}),
в итоге это получается 64 символа.

Одна отличительная особенность строк в формате base64, это то что они часто (хотя и не всегда) заканчиваются
одним или двумя символами знака равенства (\q{=}) для выравнивания (\gls{padding}), например:

\begin{lstlisting}
AVjbbVSVfcUMu1xvjaMgjNtueRwBbxnyJw8dpGnLW8ZW8aKG3v4Y0icuQT+qEJAp9lAOuWs=
\end{lstlisting}

\begin{lstlisting}
WVjbbVSVfcUMu1xvjaMgjNtueRwBbxnyJw8dpGnLW8ZW8aKG3v4Y0icuQT+qEJAp9lAOuQ==
\end{lstlisting}

Так что знак равенства (\q{=}) никогда не встречается в середине строк закодированных в base64.

Теперь пример кодирования вручную.
Попробуем закодировать шестнадцатеричные байты 0x00, 0x11, 0x22, 0x33 в строку в формате base64:

\lstinputlisting{digging_into_code/strings/base64_ex.sh}

Запишем все 4 байта в двоичной форме, затем перегруппируем их в 6-битные группы:

\begin{lstlisting}
|  00  ||  11  ||  22  ||  33  ||      ||      |
00000000000100010010001000110011????????????????
| A  || B  || E  || i  || M  || w  || =  || =  |
\end{lstlisting}

Первые три байта (0x00, 0x11, 0x22) можно закодировать в 4 base64-символа (``ABEi''),
но последний (0x33) --- нельзя,
так что он кодируется используя два символа (``Mw'') и \gls{padding}-символ (``='')
добавляется дважды, чтобы выровнять последнюю группу до 4-х символов.
Таким образом, длина всех корректных base64-строк всегда делится на 4.

\myindex{XML}
\myindex{PGP}
Base64 часто используется когда нужно закодировать двоичные данные в XML.
PGP-ключи и подписи в ``armored''-виде (т.е., в текстовом) кодируются в base64.

Некоторые люди пытаются использовать base64 для обфускации строк:
\url{http://blog.sec-consult.com/2016/01/deliberately-hidden-backdoor-account-in.html}
\footnote{\url{http://archive.is/nDCas}}.

\myindex{base64scanner}
Существуют утилиты для сканирования бинарных файлов и нахождения в них base64-строк.
Одна из них это base64scanner\footnote{\url{https://github.com/dennis714/base64scanner}}.

\myindex{UseNet}
\myindex{FidoNet}
\myindex{Uuencoding}
\myindex{Phrack}
Еще одна система кодирования, которая была более популярна в UseNet и FidoNet это Uuencoding.
Двоичные файлы до сих пор кодируются при помощи Uuencode в журнале Phrack.
Ее возможности почти такие же, но разница с base64 в том, что имя файла также передавалось в заголовке.

\myindex{Tor}
\myindex{base32}
Кстати, у base64 есть близкий родственник - base32, алфавит которого стоит из ~10 цифр и ~26 латинских букв.
Известное многим использование, это onion-адрес
\footnote{\url{https://trac.torproject.org/projects/tor/wiki/doc/HiddenServiceNames}},
например: \url{http://3g2upl4pq6kufc4m.onion/}.
\ac{URL} не может содержать и строчные и заглавные латинские буквы, очевидно, по этой причине разработчики Tor
использовали base32.

